package JVM.第04篇_对象内存布局;

import cn.hutool.core.date.DateTime;

import java.lang.reflect.Constructor;

/**
 *
 * 1.最常用的
 *    new
 *      new 类
 *      Xxx的静态方法 （里面使用了new）
 *      XxxBuilder/XxxFactory 静态方法
 * 2.Class的newInstance():
 *      反射的方式，只能调用空参的构造器，权限必须是public
 * 3.Constructor的 newInstance(xxx):
 *      反射的方式，可以调用空参。带参的构造器，权限没有要求，实用性更强
 * 4.使用clone():
 *      不调用任何构造器，当前类需要实现Cloneable接口，实现clone(). 默认浅拷贝，
 * 5.使用反序列化:
 *      从文件中、数据库中、网络中获取一个对象的二进制流，反序列化为内存中的对象
 * 6.第三方库Objenesis,利用了asm字节码技术，动态生成Constructor对象口
 *
 */
public class A1_对象的创建方式 implements Cloneable{
    String xxx;
    public A1_对象的创建方式(String s){
        System.out.println(s);
    }
    public A1_对象的创建方式(){
        System.out.println("无参");
    }
    public static void main(String[] args) throws Exception {
        String s = new String();
        DateTime now = DateTime.now();

        Class<A1_对象的创建方式> cla = A1_对象的创建方式.class;
        Class<?> aClass = Class.forName("JVM.第04篇_对象内存布局.A1_对象的创建方式");
        //调用空参构造器  9 开始已经不推荐使用了
        A1_对象的创建方式 f = cla.newInstance();

        Constructor<A1_对象的创建方式> declaredMethod = cla.getDeclaredConstructor(String.class);
        A1_对象的创建方式 a1_对象的创建方式 = declaredMethod.newInstance("555");

        /**
         * @see java学习.第15章_File类与IO流.H_对象流
         */

    }

}
